//----------------------------------------------------------------------------
//  ,-.
// /_\___ ,   Ninja Framework
// '  ___\    (C) Riccardo Capra - http://riccar.do
//  //   \\
//----------------------------------------------------------------------------
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
//----------------------------------------------------------------------------

#ifndef NJ_ATOMIC_STACK_INLINE_H
#	define NJ_ATOMIC_STACK_INLINE_H

	//----------------------------------------------------------------------------
	inline NjAtomicStack::FlushNode * NjAtomicStack::FlushNode::GetNext()
	{
		return reinterpret_cast<FlushNode *>(GetNode()->m_pNext);
	}
	//----------------------------------------------------------------------------
	inline NjAtomicStack::Node * NjAtomicStack::FlushNode::GetNode()
	{
		return reinterpret_cast<Node *>(this);
	}
	//----------------------------------------------------------------------------
	inline NjAtomicStack::NjAtomicStack()
	:
		m_kHeader(0)
	{
#	if NJ_ASSERT_ENABLED
		AssertValidAddressMask();
#	endif // NJ_ASSERT_ENABLED
	}
	//----------------------------------------------------------------------------
	inline void NjAtomicStack::Push(Node * pNode)
	{
		FlushNode * const pFlushNode(reinterpret_cast<FlushNode *>(pNode));
		return PushRange(pFlushNode, pFlushNode);
	}
	//----------------------------------------------------------------------------
	inline NjAtomicStack::FlushNode * NjAtomicStack::Flush()
	{
		Pointer uValue(m_kHeader.PostExchange(0));
		return reinterpret_cast<FlushNode *>(uValue&ADDRESS_MASK);
	}
	//----------------------------------------------------------------------------

#endif // NJ_ATOMIC_STACK_INLINE_H
